Crate bellpepper_core

source ·
Expand description

bellpepper is a crate for building zk-SNARK circuits. It provides circuit traits and and primitive structures, as well as basic gadget implementations such as booleans and number abstractions.

Example circuit

Say we want to write a circuit that proves we know the preimage to some hash computed using SHA-256d (calling SHA-256 twice). The preimage must have a fixed length known in advance (because the circuit parameters will depend on it), but can otherwise have any value. We take the following strategy:

  • Witness each bit of the preimage.
  • Compute hash = SHA-256d(preimage) inside the circuit.
  • Expose hash as a public input using multiscalar packing.

Modules

  • Gadgets for allocating bits in the circuit and performing boolean logic.
  • Gadgets representing numbers in the scalar field of the underlying curve.

Structs

  • This represents a linear combination of some variables, with coefficients in the scalar field of a pairing-friendly elliptic curve group.
  • This is a “namespaced” constraint system which borrows a constraint system (pushing a namespace context) and, when dropped, pops out of the namespace context.
  • Represents a variable in our constraint system.

Enums

  • Represents the index of either an input variable or auxiliary variable.
  • This is an error that could occur during circuit synthesis contexts, such as CRS generation, proving or verification.

Constants

Traits

  • Computations are expressed in terms of arithmetic circuits, in particular rank-1 quadratic constraint systems. The Circuit trait represents a circuit that can be synthesized. The synthesize method is called during CRS generation and during proving.
  • Represents a constraint system which can have new variables allocated and constrains between them formed.

Type Definitions